package p_aop_anno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component  //IOC容器
@Aspect     //指定当前切面
public class Aop {
	//指定切入点表单式：拦截哪些方法（为哪些类生成代理对象）
	@Pointcut("execution(* p_aop_anno.*.*(..))")
	public void pointCut(){}
	//前置通知：在执行目标方法前执行
	@Before("pointCut()")
	public void begin(){
		System.out.println("事务开始/异常");
	}
	//后置/最终通知：在执行目标方法之后执行【无论是否出现异常都会执行】
	@After("pointCut()")
	public void commit(){
		System.out.println("事务提交/关闭");
	}
	//返回后通知：在调用目标方法结束后执行【出现异常不执行】
	@AfterReturning("pointCut()")
	public void afterRuturning(){
		System.out.println("afterRuturning");
	}
	//异常通知:当目标方法执行异常时候执行此关注点代码
	@AfterThrowing("pointCut()")
	public void afterThrowing(){
		System.out.println("afterThrowing");
	}
	//环绕通知：环绕目标方法执行
	@Around("pointCut()")
	public void around(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("环绕前...");
		pjp.proceed();//执行目标方法
		System.out.println("环绕后...");
		
	}
}
